package com.fq.ioc.utils;

import com.google.common.io.Files;
import com.google.common.io.Resources;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * @author jifang
 * @since 16/1/17下午3:04.
 */
public class PackageScanUtils {

    /**
     * 返回包下所有类的全限定名
     *
     * @param packageName 以`.`分割的包名
     * @return
     */
    public static List<String> scanPackage(String packageName) {
        return getClassNames(packageName, packageName.replace(".", "/"));
    }

    /**
     * @param packageName 以`.`分割的包名
     * @param packagePath 以`/`分割的路径名
     * @return
     */
    private static List<String> getClassNames(String packageName, String packagePath) {
        List<String> classNames = new ArrayList<>();

        // 扫描包对应路径下的所有文件
        File[] files = new File(Resources.getResource(packagePath).getPath()).listFiles();
        if (files != null) {
            for (File classFile : files) {
                if (classFile.isDirectory()) {
                    classNames.addAll(getClassNames(packageName + "." + classFile.getName(),
                            packagePath + "/" + classFile.getName()));
                } else {
                    String simpleClassName = Files.getNameWithoutExtension(classFile.getName());
                    classNames.add(packageName + "." + simpleClassName);
                }
            }
        }

        return classNames;
    }
}
